from collections.abc import Iterable


class MyList(object):
    def __init__(self):
        self.container = []
        self.idx = 0

    def __iter__(self):  # 只要有此方法最下面的结果就是True
        return self

    def __next__(self):
        if self.idx >= len(self.container): raise StopIteration
        val = self.container[self.idx]
        self.idx += 1
        return val

    def add(self, item):
        self.container.append(item)


class TopValues:
    def __init__(self):
        self.N = 1

    def __iter__(self):
        return self

    def __next__(self):
        VALUE = self.N
        self.N += 1
        if VALUE > 10: raise StopIteration("stopped")
        return VALUE


def Our_Gen(n_list):
    for i in n_list:
        yield i + 1


def iteratorTest():
    t = TopValues()
    print(t.__next__())  # t.__next__() = next(t)
    for i in t:
        print(i)
        if i > 10: break


def generatorTest():
    Func = Our_Gen([2, 5, 10, 3, 1])
    for i in Func:  # for循环中自带了异常处理，当它遇到Stopiteration异常的时候，会自动结束for循环
        print(i)


def myListTest():
    mylist = MyList()
    mylist.add(11)
    mylist.add(22)
    mylist.add(33)

    print(isinstance(mylist, Iterable))  # 如果结果是True 则表示mylist一定是可迭代对象，否则是不可迭代对象

    for x in mylist:
        print(x)


'''
想要构造一个迭代器，就要实现它的 __next__方法。

但这还不够，python要求迭代器本身也是可迭代的，所以我们还要为迭代器实现 __iter__方法，
而 __iter__方法要返回一个迭代器，迭代器自身正是一个迭代器，所以迭代器的 __iter__方法返回自身即可。

一个实现了__iter__方法和__next__方法的对象，就是迭代器
'''

if __name__ == '__main__':
    # generatorTest()
    myListTest()
